package com.sandyz.virtualcam.utils

import android.view.Surface
import android.widget.Toast
import tv.danmaku.ijk.media.player.IjkMediaPlayer
import java.io.BufferedReader
import java.io.File
import java.io.FileReader

/**
 * 视频播放工具类
 * 
 * 主要功能：
 * 1. 播放虚拟视频流
 * 2. 支持本地视频和网络视频
 * 3. 管理播放器生命周期
 * 4. 处理播放状态和错误
 * 
 * 实现细节：
 * - 使用ijkplayer作为播放引擎
 * - 支持Surface输出
 * - 自动循环播放
 * - 支持多种视频源
 * 
 * @author sandyz987
 * @date 2023/11/27
 */
object PlayIjk {
    /**
     * 1. 视频播放主逻辑
     * 
     * 处理流程：
     * 1.1 参数检查
     * 1.2 读取视频源配置
     * 1.3 设置播放器
     * 1.4 开始播放
     * 
     * @param vSurface 要播放虚拟视频的surface
     * @param ijkMP 播放器实例
     */
    fun play(vSurface: Surface?, ijkMP: IjkMediaPlayer?) {
        // 1.1 参数检查
        xLog("请求开始播放，virtualSurface: $vSurface, ijkMediaPlayer: $ijkMP")
        if (vSurface == null) {
            xLog("播放失败，virtualSurface为空！")
            toast(HookUtils.app, "播放失败！", Toast.LENGTH_SHORT)
            return
        } else if (ijkMP == null) {
            xLog("播放失败，ijkMediaPlayer为空！")
            toast(HookUtils.app, "播放失败！", Toast.LENGTH_SHORT)
            return
        }

        // 1.2 读取视频源配置
        val filePath = HookUtils.app?.externalCacheDir?.path?.toString() + "/stream.txt"
        var urlStr = ""
        try {
            File(filePath).let {
                if (!it.exists()) {
                    it.createNewFile()
                }
                val reader = BufferedReader(FileReader(it))
                urlStr = reader.readLine() ?: ""
                reader.close()
            }
        } catch (e: Exception) {
            toast(HookUtils.app, "读取失败！", Toast.LENGTH_SHORT)
            xLog("读取失败！")
        }

        // 1.3 确定视频源
        if (urlStr.isBlank()) {
            // 1.3.1 使用本地视频
            urlStr = HookUtils.app?.externalCacheDir?.path?.toString() + "/virtual.mp4"
            if (File(urlStr).exists()) {
                toast(HookUtils.app, "播放本地视频：$urlStr", Toast.LENGTH_LONG)
                xLog("播放本地视频：$urlStr")
            } else {
                toast(HookUtils.app, "请前往${filePath}输入视频地址！或者查看插件使用说明！", Toast.LENGTH_LONG)
                xLog("请前往${filePath}输入视频地址！或者查看插件使用说明！")
                return
            }
        } else {
            // 1.3.2 使用网络视频
            urlStr = urlStr.replace("https", "http")
        }

        // 1.4 设置播放器并开始播放
        vSurface.let {
            ijkMP.setSurface(it)
            ijkMP.isLooping = true
            ijkMP.dataSource = urlStr
            ijkMP.prepareAsync()
            ijkMP.setOnPreparedListener {
                ijkMP.start()
            }
        }

        // 1.5 记录播放状态
        toast(HookUtils.app, "开始播放，ijk:$ijkMP，surface:$vSurface url:$urlStr", Toast.LENGTH_SHORT)
        xLog("开始播放，ijk:$ijkMP，surface:$vSurface url:$urlStr")
        xLog("currentActivity: ${HookUtils.getActivities()}, currentTopActivity: ${HookUtils.getTopActivity()}")
    }
}